package com.mastercard.assets.web.util.to;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblAssetSolicitud;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblCuentaPaquete;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblTipoCuentaPaquete;

public class PaqueteAutorizar
	implements
		Serializable
{
	private int tipoHabitacion = 1 ;
	private TblAsset evento ;
	private List< TblCuenta > bindCounts = new ArrayList< TblCuenta >( ) ;
	private int[ ] paquetesSolicitados = new int[ 0 ] ;
	private SolicitudesPorCuenta[ ] solicitudesPorCuenta = new SolicitudesPorCuenta[ 0 ] ;
	
	public PaqueteAutorizar( TblAssetSolicitud solicitud , List< TblCuenta > bindCounts )
	{
		
		// toma el paquete que tiene la solicitud
		// en el caso del arreglo de TblTipoCuentaPaquetes solo puede tener un elemento
		TblPaquete paquete = solicitud.getTblTipoCuentaPaquetes( ).get( 0 ).getTblPaquete( ) ;

		this.evento = paquete.getTblAsset( ) ;
		this.tipoHabitacion = paquete.getHabitacion( ) ;
		
		if( bindCounts != null && bindCounts.size( ) > 0 )
		{
			this.bindCounts = bindCounts ;
			
			int bindCountsS = bindCounts.size( ) ;
			
			// crea el arreglo de enteros
			paquetesSolicitados = new int[ bindCountsS ] ;
			
			// crea los arreglos
			solicitudesPorCuenta = new SolicitudesPorCuenta[ bindCountsS ] ;
			
			for( int i = 0 ; i < bindCountsS ; i++ )
				solicitudesPorCuenta[ i ] = new SolicitudesPorCuenta( evento , tipoHabitacion ) ;
			
		}
	}

	public int getTipoHabitacion() {
		return tipoHabitacion;
	}

	public void setTipoHabitacion(int tipoHabitacion) {
		this.tipoHabitacion = tipoHabitacion;
	}

	public TblAsset getEvento() {
		return evento;
	}

	public void setEvento(TblAsset evento) {
		this.evento = evento;
	}
	
	public boolean verifyPackage( TblAssetSolicitud solicitud )
	{
		// en caso de uqe este en null el evento
		if( evento == null )
			return false ;
		
		// toma el paquete que tiene la solicitud
		// en el caso del arreglo de TblTipoCuentaPaquetes solo puede tener un elemento
		TblPaquete paquete = solicitud.getTblTipoCuentaPaquetes( ).get( 0 ).getTblPaquete( ) ;
		
		// toma el evento
		TblAsset eventoPaq = paquete.getTblAsset( ) ;
		
		// compara ids, si no son iguales
		if( eventoPaq.getCveAsset( ) != evento.getCveAsset( ) )
			return false ;
		// si son iguales
		else
		{
			// compara el numero de habitaciones
			if( paquete.getHabitacion( ) == tipoHabitacion )
				return true ;
			else
				return false ;
		}
	}
	
	public boolean addSolicitud( TblAssetSolicitud solicitud )
	{
		// en caso de que si sea del mismo asset
		if( verifyPackage( solicitud ) )
		{
			// obtiene la cuenta de la solicitud
			TblCuenta cuenta = solicitud.getTblCuenta( ) ;
			
			// clave de cuenta
			int cveCuenta = cuenta.getCveCuenta( ) ;
			
			// indice resultado
			int index = -1 ;
			
			if( bindCounts != null )
			{
				// recorre las cuentas
				for( TblCuenta count : bindCounts )
				{
					index++ ;
					
					// compara las claves de cuenta
					if( count.getCveCuenta( ) == cveCuenta )
						// quiebra
						break ;
				}
			}
			
			// en caso deuqe index sea mayor a -1
			if( index > -1 )
			{
				// aumenta en uno al paquetesSolicitados del indice correspondiente
				paquetesSolicitados[ index ]++ ;
				
				// agrega la solicitud
				solicitudesPorCuenta[ index ].addSolicitud( solicitud ) ;
			}
			
			return true ;
		}
		
		return false ;
	}

	public List<TblCuenta> getBindCounts() {
		return bindCounts;
	}

	public int[] getPaquetesSolicitados() {
		return paquetesSolicitados;
	}
	
	public SolicitudesPorCuenta[] getSolicitudesPorCuenta() {
		return solicitudesPorCuenta;
	}

	public int getQuantityOfPackageToAuthorize( )
	{
		// resultado
		int res = 0 ;
		
		// recorre los paqueteSolicitados
		for( int i : paquetesSolicitados )
			// suma
			res = res + i ;
		
		// regresa 
		return res ;
	}
	
	public int getQuantityOfPackageToAuthorizeFromCount( int cveCuenta )
	{
		// averigua el indice
		int index = -1 ;
		
		// recorre cuentas
		for( TblCuenta c : this.bindCounts )
		{
			// incremente index
			index++ ;
			
			// en caso de que coincidan
			if( c.getCveCuenta( ) == cveCuenta )
				break ;
		}
		
		// regresa 
		return this.paquetesSolicitados[ index ] ;
	}
}
